package daily.jun0604;

import java.time.LocalDateTime;

//包子类
class Bun {
    String pi;//皮
    String xian;//馅儿
    boolean haveBun = false;//包子的状态，默认为没有包子(false)
}

//包子铺类
class BunShop extends Thread {
    //在成员变量位置创建一个包子变量，作为锁对象
    private Bun baozi;
    int count = 0;

    //使用带参数的构造方法为这个包子赋值
    public BunShop(Bun baozi) {
        this.baozi = baozi;
    }

    //设置线程任务：生产包子
    @Override
    public void run() {
        //让包子铺一直生产包子
        while (true) {
            //保证两个线程只有一个在执行
            synchronized (baozi) {
                //判断有没有包子
                if (true == baozi.haveBun) {
                    //有包子，调用wait方法进入等待状态
                    try {
                        baozi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //被唤醒之后，包子铺生产包子
                //这里增加一些趣味性，交替生产两种包子
                if (0 == count % 2) {
                    //生产薄皮三鲜馅包子
                    baozi.pi = "薄皮";
                    baozi.xian = "三鲜馅";
                } else {
                    //生产冰皮蘑菇粉丝馅
                    baozi.pi = "冰皮";
                    baozi.xian = "蘑菇粉丝馅";
                }
                //开始做包子
                System.out.println("包子铺：正在做" + baozi.pi + baozi.xian + "包子，预计等待5秒钟");
                System.out.println(LocalDateTime.now());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //做好包子
                baozi.haveBun = true;
                //唤醒吃货线程，让他吃包子
                System.out.println("包子铺：" + baozi.pi + baozi.xian + "包子已做好，请拿好");
                System.out.println(LocalDateTime.now());
                baozi.notify();//notify方法
            }
        }
    }
}

class ChiHuo extends Thread {
    //在成员变量位置创建一个包子变量，作为锁对象
    private Bun baozi;
    int count = 0;

    //使用带参数的构造方法为这个包子赋值
    public ChiHuo(Bun baozi) {
        this.baozi = baozi;
    }

    //设置线程任务：吃包子

    @Override
    public void run() {
        //让吃货一直吃包子
        while (true) {
            synchronized (baozi) {
                //判断有没有包子
                if (false == baozi.haveBun) {
                    //没有包子就等待
                    try {
                        baozi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被唤醒之后，吃货开始吃包子
                System.out.println("吃货：收到" + baozi.pi + baozi.xian + "包子，看我3秒吃掉");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //吃货吃完包子，修改包子状态
                baozi.haveBun = false;
                System.out.println("吃货：吃完了"+baozi.pi + baozi.xian+"包子，真香，给我5秒钟喝口水再来一个");
                System.out.println(LocalDateTime.now());
                //等待5秒唤醒包子铺线程开始做包子
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                baozi.notify();//唤醒
                System.out.println("------------------------");
            }
        }
    }
}

public class BunShopTest {
    public static void main(String[] args) {
        //创建包子对象
        Bun baozi = new Bun();
        //创建包子铺线程，传入包子，然后启动线程
        new BunShop(baozi).start();
        //创建吃货线程，传入包子，然后启动线程
        new ChiHuo(baozi).start();
    }
}
